package cn.cyh.queue_service.service;

import cn.cyh.queue_service.model.dto.CallNextRequest;
import cn.cyh.queue_service.model.dto.CompleteServiceRequest;
import cn.cyh.queue_service.model.dto.PageRequest;
import cn.cyh.queue_service.model.dto.PageResult;
import cn.cyh.queue_service.model.dto.QueueStatusResponse;
import cn.cyh.queue_service.model.dto.TakeNumberRequest;
import cn.cyh.queue_service.model.dto.TakeNumberResponse;
import cn.cyh.queue_service.model.dto.VerifyRequest;
import cn.cyh.queue_service.model.entity.Queue;
import cn.cyh.queue_service.model.vo.QueueVO;

import java.util.List;

/**
 * 队列服务接口
 */
public interface QueueService {
    
    /**
     * 客户取号
     * 
     * @param request 取号请求
     * @return 取号响应
     */
    TakeNumberResponse takeNumber(TakeNumberRequest request);
    
    /**
     * 叫号
     * 
     * @param request 叫号请求
     * @return 被叫的队列记录视图对象
     */
    QueueVO callNext(CallNextRequest request);
    
    /**
     * 人脸验证
     * 
     * @param request 验证请求
     * @return 是否验证成功
     */
    boolean verifyFace(VerifyRequest request);
    
    /**
     * 开始服务
     * 
     * @param ticketNumber 票号
     * @param windowId 窗口ID
     * @return 是否成功
     */
    boolean startService(String ticketNumber, Long windowId);
    
    /**
     * 完成服务
     * 
     * @param request 完成服务请求
     * @return 是否成功
     */
    boolean completeService(CompleteServiceRequest request);
    
    /**
     * 标记为未到场
     * 
     * @param ticketNumber 票号
     * @param windowId 窗口ID
     * @return 是否成功
     */
    boolean markAsNoShow(String ticketNumber, Long windowId);
    
    /**
     * 重新叫号
     * 
     * @param ticketNumber 票号
     * @param windowId 窗口ID
     * @return 是否成功
     */
    boolean recall(String ticketNumber, Long windowId);
    
    /**
     * 根据票号获取队列状态
     * 
     * @param ticketNumber 票号
     * @return 队列状态响应
     */
    QueueStatusResponse getQueueStatus(String ticketNumber);
    
    /**
     * 根据等待中的队列列表
     * 
     * @return 队列列表
     */
    List<QueueVO> getWaitingQueues();
    
    /**
     * 获取指定业务类型的等待人数
     * 
     * @param serviceTypeId 业务类型ID
     * @return 等待人数
     */
    int getWaitingCountByServiceType(Long serviceTypeId);
    
    /**
     * 获取指定窗口当前服务的队列记录
     * 
     * @param windowId 窗口ID
     * @return 队列记录视图对象
     */
    QueueVO getCurrentQueueByWindow(Long windowId);
    
    /**
     * 分页查询队列列表
     * 
     * @param pageRequest 分页请求
     * @param status 状态（可选）
     * @param serviceTypeId 业务类型ID（可选）
     * @return 分页结果
     */
    PageResult<QueueVO> getQueueList(PageRequest pageRequest, String status, Long serviceTypeId);
    
    /**
     * 根据票号获取队列记录
     * 
     * @param ticketNumber 票号
     * @return 队列记录视图对象
     */
    QueueVO getByTicketNumber(String ticketNumber);
    
    /**
     * 计算预估等待时间
     * 
     * @param serviceTypeId 业务类型ID
     * @param position 在队列中的位置
     * @return 预估等待时间（分钟）
     */
    int calculateEstimatedWaitTime(Long serviceTypeId, int position);
    
    /**
     * 重置所有队列状态（通常在系统初始化时调用）
     * 将所有未完成的队列标记为已完成或未到场
     * 
     * @return 处理的记录数
     */
    int resetAllQueueStatus();
    
    /**
     * 验证人脸特征
     *
     * @param image Base64编码的人脸图像
     * @param userId 用户ID
     * @return 验证结果
     */
    boolean verifyFaceFeature(String image, String userId);

    List<QueueVO> getQueueHistoryByWindowId(Long windowId);

    /**
     * 获取正在被叫号的队列
     * @return QueueVO
     */
    Queue getCurrentQueue();

    List<Queue> geTodayQueue();
}